namespace My
{
    template<class T, class D = Delete<T>>
    class unique_ptr
    {
        typedef unique_ptr<T, D> uptr;
    public:
        unique_ptr(T* ptr = nullptr)
            :_ptr(ptr)
        {}

        unique_ptr(const uptr& ptr) = delete;
        uptr& operator=(const uptr& ptr) = delete;

        ~unique_ptr()
        {
            D()(_ptr);
        }

        T& operator*() { return *_ptr; }
        T* operator->() { return _ptr; }

    private:
        T* _ptr;
    };
}
